# -*- coding: UTF-8 -*-

class Joueur():
    def __init__(self, nom, couleur,partie=None, id=None, emplacement=None):
        self.nom = nom
        self.couleur = couleur
        self.partie = partie
        self.id = id
        self.emplacement = emplacement #sois un systeme ou une planete; pas un string, un OBJET systeme ou planete
        
        self.listeStatus = {} #Liste des status entre les joueurs
        self.demandesEnAttente = [] #Servira a stocker les demandes envoyees par les autres joueurs (demandes d'alliance, etc.)  Les elements de cette liste sont des listes de la forme (joueurCible, joueurDemandant, type, statut)
        #dictionnaire avec les methodes a appeler selon le type de demande (sera utilise par traiterDemandes())
        #Le parametre d dans les lambda est la demande en tant que telle (sous forme de liste)
        #La maniere d'utiliser ce dictionnaire est ainsi :
        #Pour appeler la methode associee alliance :
        #self.actionsDemande["alliance"](demande)
        self.actionsDemande = {
                               "alliance" : lambda d: self.alliance(d),
                               "traiteDePaix" : lambda d: self.traiteDePaix(d),
                               "paix" : lambda d: self.paix(d),
                               "resilierTraite" : lambda d: self.resilierTraite(d)
                               }

        
    def remplirListeStatuts(self):
        copieListeJoueurs = list(self.partie.joueurs) #On cree une copie de la liste, car on va enlever des elements, mais on ne veut pas que ca se repercute dans la vraie liste
        for unJoueur in copieListeJoueurs:
            copieListeJoueurs.remove(unJoueur)
            for autreJoueur in copieListeJoueurs:
                self.listeStatus[(unJoueur.nom, autreJoueur.nom)] = "neutre" 
        
    def isStatus(self, nomJoueur1, nomJoueur2, status):
        if((nomJoueur1, nomJoueur2) in self.listeStatus):
            if(self.listeStatus.get((nomJoueur1, nomJoueur2)) == status):
                return True
        elif((nomJoueur2, nomJoueur1) in self.listeStatus):
            if(self.listeStatus.get((nomJoueur2, nomJoueur1)) == status):
                return True
        return False

    def modifierStatus(self, nomJoueur1, nomJoueur2, newStatus):
        if((nomJoueur1, nomJoueur2) in self.listeStatus):
            self.listeStatus[(nomJoueur1, nomJoueur2)] = newStatus
        elif((nomJoueur2, nomJoueur1) in self.listeStatus):
             self.listeStatus[(nomJoueur2, nomJoueur1)] = newStatus

    def statusConcernes(self):
        tempo = self.listeStatus.items()
        listeStatusConcernes = []
        for i in tempo:
            if(i[0][0] == self.nom):
                listeStatusConcernes.append((i[0][1], i[1]))
            elif(i[0][1] == self.nom):
                listeStatusConcernes.append((i[0][0], i[1]))
        return listeStatusConcernes
    
    def getStatusJoueur(self, nomJoueur):
        listeStatus = self.statusConcernes()
        index = [y[0] if y[0]==nomJoueur else y[1] for y in listeStatus].index(nomJoueur)
        return listeStatus[index][1]
    #[joueurCible,joueurDemandant, type, status]
    #Liste des status des demandes : attenteReponse, refuse, accepte
    #Liste des types de demande : alliance, traiteDePaix, paix, resilierTraite
    
    #M�thode permettant d'ajouter ou de modifier une demande � L'INTERNE (n'envoie pas les demandes aux autres joueurs).  
    #Pour envoyer des nouveaux status de demandes aux autres joueurs, voir envoyerDemande() et traiterDemande()
    def ajouterModifierDemande(self, joueurCible, joueurDemandant, type, newStatus = "attenteReponse"):
        new_demande = [joueurCible, joueurDemandant, type, newStatus]
        #Regarder si la demande existe d�j� dans la liste
        for i in self.demandesEnAttente:
            #On ne compare que le joueur cible, le joueur demandant et le type de demande 
            #(donc les trois premiers �l�ments de la list)
            if i[:3] == new_demande[:3]:
                #Si c'est la bonne demande, updater son status et quitter la m�thode
                i[3] = new_demande[3]
                print("Status updat�")
                return
        #Si c'est une nouvelle demande
        self.demandesEnAttente.append(new_demande)
        
    def envoyerDemande(self, demande):
        self.controleur.envoyerDemande(demande)
    
    def envoyerChangementStatus(self, nomJoueur1, nomJoueur2, newStatus):
        self.controleur.modifierStatus(nomJoueur1, nomJoueur2, newStatus)
        
    #M�thode traitant les demandes en attentes et accomplissant les actions rattach�es aux demandes
    #ie : envoyer une ActionChangerStatus
    def traiterDemandes(self):
        for i in self.demandesEnAttente:
            if self.nom in i:
                self.actionsDemande[i[2]](i)
                
    def alliance(self, demande):
        #v�rifier si on est la cible de la demande
        if demande[0] == self.nom:
            if demande[3] == "attenteReponse":
                #Faire la notification sur la vue.
                self.notificationDiplomatie()
        #V�rifier si on est le demandeur et si le status de la demande n�cessite une action (refus�, accept�e)
        elif demande[1] == self.nom:
            self.controleur.actionSupprimerDemande(demande)
            self.notificationDiplomatie()
            
    def traiteDePaix(self, demande):
        pass
    
    def paix(self, demande):
        #Code identique � alliance().  La m�thode est quand m�me l� en cas de changement.
        alliance(demande)
    
    def resilierTraite(self, demande):
        pass
    
    def supprimerDemande(self, demande):
        self.demandesEnAttente.remove(demande)
    
    #Appelle le controleur pour faire clignoter le bouton de diplomatie
    def notificationDiplomatie(self):
        self.controleur.notificationDiplomatie()
        
    #Retourne une list des demandes contenant le nom du joueur.
    def demandesConcernees(self):
        return [uneDemande for uneDemande in self.demandesEnAttente if self.nom in uneDemande]
    

#TODO : remettre le module winsound
#TODO : remplir le frame diplomatie avec les boutons et les actions reli�es (controleur, etc.) 
#TODO : Les analyses des  demandes retourn�es par demandesConcern�es() se font dans le controleur et le controleur dira � la vue quoi dessiner en appelant les m�thode de dessin de la vue.
#TODO : m�thode dans le controleur et la vue pour faire clignoter le bouton de diplomatie et la mettre dans joueur.py dans la m�thode notificationDiplomatie()
#TODO : Les notifications du bouton diplomatie...la m�thode acceptera comme param�tre le nom du joueur concern� pour mettre en surbrillance la personne concern�e
#TODO : Faire des constantes pour plusieurs affaires ( PE index dans une list de demande, les status de demandes, les status de joueur, les types de demande...) et faire le refactoring n�cessaire
#TODO : Ajouter les trait�s de paix
#TODO : Faire une classe et peut-�tre un autre fichier pour les demandes sur le joueur.  Code plus concis et plus class�.
